import {
  reqGetCartList,
  reqUpdateCartIsChecked,
  reqUpdateAllCartIsChecked,
  reqDelCart,
  reqDelAllCart,
  reqAddToCart,
} from "@/api/shopcart";

export default {
  namespaced: true,
  state: {
    cartList: [],
  },
  getters: {
    isAllChecked(state) {
      return state.cartList.every((cart) => cart.isChecked);
    },
    isCheckedNum(state) {
      return state.cartList.reduce((p, c) => {
        return p + (c.isChecked ? c.skuNum : 0);
      }, 0);
    },
    totalPrice(state) {
      return state.cartList.reduce((p, c) => {
        return p + (c.isChecked ? c.skuNum * c.cartPrice : 0);
      }, 0);
    },
  },
  actions: {
    // 1. 获取购物车列表展示
    async getCartList({ commit }) {
      const res = await reqGetCartList();
      // 如果没有数据：[]
      // 如果有数据：[{ cartInfoList: [], xxx }]
      commit("GET_CART_LIST", res[0] ? res[0].cartInfoList : []);
    },
    // 2. 单选
    async updateCartIsChecked({ commit }, { skuId, isChecked }) {
      // 发送请求更新服务器数据
      await reqUpdateCartIsChecked(skuId, isChecked);
      // 触发mutation，更新客户端数据
      commit("UPDATE_CART_IS_CHECKED", { skuId, isChecked });
    },
    // 3. 全选/全不选
    async updateAllCartIsChecked({ commit, state }, isChecked) {
      // 1. 找出所有需要更新的商品
      // 需要得到部分需要更新的商品（长度变，值不变，用filter）
      // 在vuex完成这个事，能让外面使用者更简单
      const skuIdList = state.cartList
        .filter((cart) => {
          return cart.isChecked !== isChecked;
        })
        .map((cart) => cart.skuId);
      // 2. 发送请求，更新服务器数据
      await reqUpdateAllCartIsChecked(skuIdList, isChecked);
      // 3. 触发mutations，更新客户端数据
      commit("UPDATE_ALL_CART_IS_CHECKED", { skuIdList, isChecked });
    },
    // 4. 单个删除
    async delCart({ commit }, skuId) {
      await reqDelCart(skuId);
      commit("DEL_CART", skuId);
    },
    // 5. 批量删除
    async delAllCart({ commit, state }) {
      const skuIdList = state.cartList
        // isChecked为1返回true，会保留下来
        .filter((cart) => cart.isChecked)
        .map((cart) => cart.skuId);
      await reqDelAllCart(skuIdList);
      commit("DEL_ALL_CART");
    },
    // 6. 修改商品数量
    async updateCartSkuNum({ commit }, { skuId, skuNum }) {
      await reqAddToCart(skuId, skuNum);
      commit("UPDATE_CART_SKU_NUM", { skuId, skuNum });
    },
  },
  mutations: {
    GET_CART_LIST(state, cartList) {
      state.cartList = cartList;
    },
    UPDATE_CART_IS_CHECKED(state, { skuId, isChecked }) {
      state.cartList.find((cart) => cart.skuId === skuId).isChecked = isChecked;
    },
    UPDATE_ALL_CART_IS_CHECKED(state, { skuIdList, isChecked }) {
      state.cartList.forEach((cart) => {
        if (skuIdList.includes(cart.skuId)) {
          cart.isChecked = isChecked;
        }
        // 最简单的就是无脑更新。反正如果更新的值一样也不会有问题
        // cart.isChecked = isChecked;
      });
    },
    DEL_CART(state, skuId) {
      state.cartList = state.cartList.filter((cart) => cart.skuId !== skuId);
    },
    DEL_ALL_CART(state) {
      state.cartList = state.cartList.filter((cart) => !cart.isChecked);
    },
    UPDATE_CART_SKU_NUM(state, { skuId, skuNum }) {
      // 需要加上需要更新的数量
      state.cartList.find((cart) => cart.skuId === skuId).skuNum += skuNum;
    },
  },
};
